package org.rest.annotations.resources;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicHeader;
import org.junit.Test;
import com.ning.http.client.AsyncHttpClient;
import com.ning.http.client.Response;
import de.alpharogroup.test.objects.Employee;
import de.alpharogroup.test.objects.Gender;
import de.alpharogroup.test.objects.Person;
import de.alpharogroup.xml.json.JsonTransformer;
public class EmployeeResourceTest
{
/** The employees. */
private final List<Employee> employees;
{
employees = new ArrayList<>();
employees
.add(
Employee
.builder().person(Person.builder().gender(Gender.FEMALE).name("Anna")
.married(true).about("Ha ha ha...").nickname("beast").build())
.id("23").build());
employees
.add(Employee
.builder().person(Person.builder().gender(Gender.MALE).name("Andreas")
.married(false).about("fine person").nickname("cute").build())
.id("24").build());
employees
.add(Employee
.builder().person(Person.builder().gender(Gender.FEMALE).name("Tatjana")
.married(false).about("Im hot").nickname("beautiful").build())
.id("25").build());
}
@Test
public void testCreate() throws ClientProtocolException, IOException
{
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost("http://localhost:8080/employeesmanager/create");
String jsonString = "{\"id\":\"26\",\"person\":{\"married\":true,\"nickname\":\"beast\",\"name\":\"Anna\",\"about\":\"Ha ha ha...\",\"gender\":\"FEMALE\"}}";
Employee expected = JsonTransformer.toObject(jsonString, Employee.class);
// Add authorization base64...
Base64 b = new Base64();
String encoding = b.encodeAsString(new String("wicket:wicket").getBytes());
post.addHeader("Authorization", "Basic " + encoding);
StringEntity input = new StringEntity(jsonString);
input.setContentType("application/json");
post.setEntity(input);
HttpResponse response = client.execute(post);
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
String json = IOUtils.toString(rd);
Employee actual = JsonTransformer.toObject(json, Employee.class);
assertTrue(expected.equals(actual));
HttpDelete delete = new HttpDelete("http://localhost:8080/employeesmanager/delete/26");
client.execute(delete);
}
@Test
public void testDelete() throws ClientProtocolException, IOException
{
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost("http://localhost:8080/employeesmanager/create");
String jsonString = "{\"id\":\"26\",\"person\":{\"married\":true,\"nickname\":\"beast\",\"name\":\"Anna\",\"about\":\"Ha ha ha...\",\"gender\":\"FEMALE\"}}";
Employee expected = JsonTransformer.toObject(jsonString, Employee.class);
// Add authorization base64...
Base64 b = new Base64();
String encoding = b.encodeAsString(new String("wicket:wicket").getBytes());
post.addHeader("Authorization", "Basic " + encoding);
StringEntity input = new StringEntity(jsonString);
input.setContentType("application/json");
post.setEntity(input);
HttpResponse response = client.execute(post);
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
String json = IOUtils.toString(rd);
Employee actual = JsonTransformer.toObject(json, Employee.class);
assertTrue(expected.equals(actual));
HttpDelete delete = new HttpDelete("http://localhost:8080/employeesmanager/delete/26");
Header authorizationHeader = new BasicHeader("Authorization", "Basic " + encoding);
delete.addHeader(authorizationHeader);
response = client.execute(delete);
}
@Test
public void testGetAll() throws InterruptedException, ExecutionException, IOException
{
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
Future<Response> f = asyncHttpClient
.prepareGet("http://localhost:8080/employeesmanager/employees").execute();
Response r = f.get();
String responseString = r.getResponseBody();
asyncHttpClient.close();
List<Employee> actual = JsonTransformer.toObjectList(responseString, Employee.class);
for (Employee employee : actual)
{
assertTrue(employees.contains(employee));
}
}
@Test
public void testRead() throws InterruptedException, ExecutionException, IOException
{
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
Future<Response> f = asyncHttpClient
.prepareGet("http://localhost:8080/employeesmanager/read/24").execute();
Response r = f.get();
String responseString = r.getResponseBody();
asyncHttpClient.close();
Employee actual = JsonTransformer.toObject(responseString, Employee.class);
for (Employee employee : employees)
{
if (employee.getId().equals("24"))
{
assertTrue(employee.equals(actual));
}
}
}
@Test
public void testUpdate()
throws ClientProtocolException, IOException, InterruptedException, ExecutionException
{
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost("http://localhost:8080/employeesmanager/create");
String jsonString = "{\"id\":\"26\",\"person\":{\"married\":true,\"nickname\":\"beast\",\"name\":\"Anna\",\"about\":\"Ha ha ha...\",\"gender\":\"FEMALE\"}}";
// Add authorization base64...
Base64 b = new Base64();
String encoding = b.encodeAsString(new String("wicket:wicket").getBytes());
post.addHeader("Authorization", "Basic " + encoding);
StringEntity input = new StringEntity(jsonString);
input.setContentType("application/json");
post.setEntity(input);
client.execute(post);
client = HttpClientBuilder.create().build();
HttpPut put = new HttpPut("http://localhost:8080/employeesmanager/update");
jsonString = "{\"id\":\"26\",\"person\":{\"married\":false,\"nickname\":\"beast\",\"name\":\"Anna\",\"about\":\"Ha ha ha...\",\"gender\":\"FEMALE\"}}";
Employee expected = JsonTransformer.toObject(jsonString, Employee.class);
input = new StringEntity(jsonString);
input.setContentType("application/json");
put.setEntity(input);
client.execute(put);
//
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
Future<Response> f = asyncHttpClient
.prepareGet("http://localhost:8080/employeesmanager/read/26").execute();
Response r = f.get();
String responseString = r.getResponseBody();
asyncHttpClient.close();
Employee actual = JsonTransformer.toObject(responseString, Employee.class);
assertTrue(expected.equals(actual));
// clean up...
HttpDelete delete = new HttpDelete("http://localhost:8080/employeesmanager/delete/26");
client.execute(delete);
}
}